package od.one;

/**
 * @author: Shelly
 * @create: 2024-01-30 15:02:27
 * @version: 1.0
 * @describe: 寻找最富裕的小家庭
 * 题目描述
 * 在一棵树中，每个节点代表一个家庭成员，节点的数字表示其个人的财富值，一个节点及其直接相连的子节点被定义为一个小家庭。
 * 现给你一棵树，请计算出最富裕的小家庭的财富和。
 * 输入描述
 * 第一行为一个数N, 表示成员总数, 成员编号1-N,1<=N<=1000
 * 第二行为N个空格分隔的数，表示编号1-N的成员的财富值。 0<=财富值<=1000000
 * 接下来N-1行，每行两个空格分隔的整数(N1N2)，表示N1是N2的父节点。
 * 输出描述
 * 最富裕的小家庭的财富和
 * 用例
 * 输入
 * 1   4
 * 2  100 200 300 500
 * 3  1 2
 * 4  1 3
 * 5  2 4
 * 输出
 * 1   700
 * 说明
 * 成员1，2，3组成的小家庭财富值为600
 * 成员2，4组成的小家庭财富值为700
 */
public class OD21 {
}
/*
* 解题思路
1.首先，读取成员总数N和每个成员的财富值。为了方便处理，我们将财富值存储在一个数组wealth中，下标从1开始。
2.初始化一个数组familyWealth，用于存储每个小家庭的财富和。初始时，每个小家庭的财富和等于对应成员的财富值。
3.初始化一个变量maxWealth，用于存储最大的财富和。 初始值为0。
4.遍历每个父子关系，对于每个关系，执行以下操作：
a.读取父子关系中的两个成员N1和N2。
b.将N2的财富值累加到N1所在小家庭的财富和中, 即更新familyWealth[N1]。
c.更新最大的财富和maxWealth，使其始终为当前已遍历的小家庭中财富和的最大值。
5.遍历完所有父子关系后，maxWealth即为最富裕的小家庭的财富和。 输出maxWealth作为结果。
这种解题思路的时间复杂度为O(N)，因为我们只需要遍历一次父子关系，就可以计算出每个小家庭的财富和，并在过程中更新最大的财富和。这种方法相对高效。
* */